package pe.edu.upc.e41a.javasoft.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.upc.e41a.javasoft.domain.Categoria;
import pe.edu.upc.e41a.javasoft.domain.Usuario;

import javax.persistence.TypedQuery;

@Service
@Transactional
public class CategoriaServiceImpl implements CategoriaService {

	public long countAllCategorias() {
        return Categoria.countCategorias();
    }

	public void deleteCategoria(Categoria categoria) {
        categoria.remove();
    }

	public Categoria findCategoria(Integer id) {
        return Categoria.findCategoria(id);
    }

	public List<Categoria> findAllCategorias() {
        return Categoria.findAllCategorias();
    }

	public List<Categoria> findCategoriaEntries(int firstResult, int maxResults) {
        return Categoria.findCategoriaEntries(firstResult, maxResults);
    }

	public void saveCategoria(Categoria categoria) {
        categoria.persist();
    }

	public Categoria updateCategoria(Categoria categoria) {
        return categoria.merge();
    }
	
	//DESDE PROYECTO SCV
	public String insertarCategoria(Categoria categoria) {
		String mensaje =null;
		try {
			mensaje = ValidaCategoria(categoria);
			if (mensaje != "ok")
				return mensaje;
			mensaje = buscarCategoriaPorNombreIgual(categoria.getNombre());
			if (mensaje != "ok")
				return mensaje;
			categoria.persist();	
			mensaje="La Categoría se registró exitosamente";
		} catch (Exception e) {
			//mensaje="Error al registrar categoría";
			//return mensaje;
		}
		
		return mensaje;
	}

	private String ValidaCategoria(Categoria categoria){
		String mensaje = "ok";
		if (categoria.getNombre()==null) {
			mensaje="El nombre categoría no puede ser Nulo";
		} else if (categoria.getDescripcion()==null) {
			mensaje ="La descripción de Categoría no puede ser Nulo";
		} {

		}

		return mensaje;
	}


	public List<Categoria> listarCategoria() {
		List<Categoria> mListCategorias;
		mListCategorias = Categoria.findAllCategorias();
		return mListCategorias;
	}


	public List<Categoria> findCategoriasByPadreIsNull() {
			TypedQuery<Categoria> categoriaNivelCero = Categoria.findCategoriasByPadreIsNull();
			return categoriaNivelCero.getResultList();
	}


	public List<Categoria> findCategoriasByPadre(Categoria categoria) {
		TypedQuery<Categoria> categoriaNivelUno = Categoria.findCategoriasByPadre(categoria);
		return categoriaNivelUno.getResultList();
	}


	public Categoria buscarCategoriaPorNombre(String nombre) {
		TypedQuery<Categoria> categoriaResultado = Categoria.findCategoriasByNombreEquals(nombre);
		return categoriaResultado.getSingleResult();
	}

	@Override
	public String buscarCategoriaPorNombreIgual(String nombre) {
		String mensaje = null;
		try {
			TypedQuery<Categoria> categoriaResultado = Categoria.findCategoriasByNombreEquals(nombre);
			if (categoriaResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				mensaje = "Ya existe una Categoría con este nombre";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}


	
	
	
	
	
	
}
